package com.sky.task;

import com.sky.entity.Orders;
import com.sky.mapper.OrdersMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 定时任务, 处理超时未支付订单与一直派送的订单
 */
@Slf4j
@Component
public class OrderTask {

    @Autowired
    private OrdersMapper ordersMapper;

    /**
     * 每分钟检查一次是否存在超时未支付订单(下单超过15分钟未支付就代表超时, 需要修改状态为已取消)
     */
    //* 与 0/1 是一个意思, 就是在这个域的时间位上, 每一次都会执行
    //写具体的数据, 就是在这个的时间是被限制死的
    @Scheduled(cron = "0 * * * * ?")
    public void processOutTimeOrder(){
        //1、查询数据库orders表, 条件: 状态-未支付, 下单时间 < 当前时间 - 15分钟
        // select * from orders where status = 1 and order_time < 当前时间- 15分钟
        LocalDateTime time = LocalDateTime.now().minusMinutes(15);
        //查询到的数据, 可能有多条
        List<Orders> ordersList = ordersMapper.selectByStatusAndOrderTime(Orders.PENDING_PAYMENT, time);
        //2、判断是否查询到数据, 查询到数据,代表存在超时未支付订单, 需要修改订单的状态为"status = 6 "
        //2.1判断是否存在数据
        // 不使用卫语句
        if (ordersList != null || !ordersList.isEmpty()){
            //2.2到了这里面, 证明是存在超时未支付订单, 遍历所有订单
            ordersList.forEach(orders -> {
                //2.3设置状态
                orders.setStatus(Orders.CANCELLED);
                orders.setCancelTime(LocalDateTime.now());
                orders.setCancelReason("订单超时, 自动取消");
                //3、调用mapper层进行更新
                ordersMapper.update(orders);
            });

        }
    }

    /**
     * 每天凌晨1点检查一次订单表, 查看是否存在"派送中"的订单, 如果存在修改状态为"已完成"
     */
    @Scheduled(cron = "0 0 1 * * ?")
//    @Scheduled(cron = "0 30 22 * * ?") //TODO : 测试用: 22:30分触发 -- > 测试完成, 要改回去, 不然, 上线,就麻烦了

    public void processDeliverOrder(){
        //1、查询数据库orders表, 条件: 状态-派送中, 下单时间 < 当前时间 - 1h
        //select * from orders where status = 1 and order_time < 当前时间- 15分钟
        LocalDateTime time = LocalDateTime.now().minusHours(1);
        //调用mapper层, 进行获取数据
        List<Orders> ordersList = ordersMapper.selectByStatusAndOrderTime(Orders.DELIVERY_IN_PROGRESS, time);
        //2、如果查询到了数据, 代表存在一直派送中的订单, 需要修改订单的状态为 "status = 5"
        //2.1判断是否存在数据
        // 不使用卫语句
        if (ordersList != null || !ordersList.isEmpty()){
            //2.2到了这里面, 证明是存在超时未支付订单, 遍历所有订单
            ordersList.forEach(orders -> {
                //2.3设置状态
                orders.setStatus(Orders.COMPLETED);
                orders.setDeliveryTime(time);
                //3、调用mapper层进行更新
                ordersMapper.update(orders);
            });
        }
    }



}
